package com.lightjet.macross.base.awf.service;

import com.lightjet.macross.base.awf.domain.BizFormIndex;
import com.lightjet.macross.base.awf.dto.*;
import com.lightjet.macross.common.dto.ResultDTO;
import org.activiti.engine.task.Task;

import java.io.InputStream;
import java.util.*;

/**
 * @author : lijia
 * @version : 1.0 2019-02-15 16:55
 * description : 流程服务层接口 封装activiti 流程服务
 */
public interface ProcessService {

    /** description:发起流程  */
    ResultDTO<String> StartProcess(FlowDataDTO startFormDTO);

    /** description:流程节点创建时用于给流程dataform进行标记 明确当前节点需要读取的上一点，该节点以前的节点均设置为过期  */
    void ProcessNodeForm(String procinstid, String activityid);

    /** description:获取上个节点且非本节点的表单列表  */
    List<HashMap> GetPreviousForms(String procinstid, String activityid);

    /** description:获取上个所有非过期节点的表单列表  */
    List<HashMap> GetPreviousUnExpiredForms(String procinstid, String activityid);

    /** description:根据taskid 获取上个节点的表单列表 */
    List<HashMap> GetPreviousFormsByTaskId(String taskid);

    /** description:根据taskid 以及节信息（节点名称或节点formkey）获取  */
    List<HashMap> GetPreviousFormsByTaskIdAndNode(String taskid, String node);

    /** description:完成节点处理  */
    ResultDTO<String> ExecuteProcess(FlowDataDTO formDTO);

    List<Task> GetAllMyTask(String userId);

    /** description:根据用户ID和流程定义ID获取我的业务任务（带索引信息）  */
    List<HashMap> GetMyBizTask(String userId, String pdkey);

    /** description:根据用户ID和查询条件获取我的业务任务（带索引信息）  */
    List<HashMap<String, String>> GetMyBizTaskByQuery(String userId, String pdkey, String tdkey, HashMap<String, String> bizquery);

    /** description:获取我的任务的汇总信息  */
    /*Map<String, Long> GetMyBizTaskSummary(String userId);*/

    /** description:获取我的任务的汇总信息  */
    List<ProcDefDTO> GetMyBizTaskSummary(String userId);

    /** description:获取我的任务的汇总信息  */
    List<ProcDefDTO> GetMyBizTaskSummary(String userId, List<String> keylist);

    /** description:获取我的任务的汇总信息(根据单个流程定义ID获取)  */
    List<ProcDefDTO> GetMyBizTaskSummary(String userId, String pdkey);

    /** description:获取当前同级节点的表单列表（主要用于会签节点）  */
    List<HashMap> GetCurrentForms(String procinstid, String activityid);

    /** description:根据任务号获取当前同级节点的表单列表（主要用于会签节点）  */
    List<HashMap> GetCurrentForms(String taskid);

    /** description:获取当前处理表单最后一个节点的所有表单  */
    List<HashMap> GetLastForms(String procinstid);

    /** description:流程跳转  */
    ResultDTO<String> JumpTask(String currentTaskid, String targetTaskDefId, String jumpReason, String operid);

    /** description:获取流程查看图  */
    InputStream GetProcessView(String procinstid);

    /** description:获取当前所有流程最新版本的定义  */
    List<ProcDefDTO> GetProcessLatestDefSet();

    /** description:获取当前所有流程版本的定义  */
    List<ProcDefDTO> GetProcessAllDefSet();

    /** description:获取当前所有在途流程  流程明细一同带出*/
    List<ProcDefDTO> GetRunningProcess(String pdkey);

    /** description:获取当前所有在途流程的流程定义信息汇总 无明细  */
    List<ProcDefDTO> GetRunningProcessSummary(String pdkey);

    /** description:获取当前所有在途流程的流程定义信息汇总 无明细  */
    List<ProcDefDTO> GetRunningProcessSummary(Set<String> pdkeys);

    /** description:根据流程定义ID获取当前在途流程的明细  */
    List<ProcInstDTO> GetRunningProcessDetail(String pdid);

    /** description:根据流程定义ID获取 节点定义信息  */
    List<NodeDefDTO> GetTaskNodeDefSet(String pdid);

    /** description:根据流程定义ID获取 节点定义信息 (含服务节点) */
    public List<NodeDefDTO> GetTaskNodeDefSetWithServiceTask(String pdid);

    /** description:根据流程实例ID 获取任务处理历史信息  */
    List<TaskInstDTO> GetTaskHistory(String piid);

    /** description:删除流程  */
    ResultDTO<String> DeleteProcess(List<String> piids, String reason);

    /** description:修复流程  */
    ResultDTO<String> FixTask(List<String> tiids);

    /** description:获取流程审批历史信息  */
    List<HashMap> GetProcessAuditHistory(String taskid);

    /** description:根据流程实例ID获取流程审批历史信息  */
    List<HashMap> GetProcessAuditHistoryByPIID(String piid);

    /** description:流程转办  */
    ResultDTO<String> ChangeAssinee(String taskid, String targetuserid);

    /** description:根据任务ID获取任务候选人  */
    List<String> GetCandidateUsers(String taskid);

    /** description:将制定流程定义的在途流程全部转给代理人 procdefkey 为* 表示全部  */
    ResultDTO RunningProcAgent(String procdefkey, String principalid, String agentid);

    /** description:根据用户ID和起始时间查询范围内流程汇总信息  */
    List<ProcDefDTO> GetHistorySummary(String userid, Date startdate, Date enddate);

    /** description:根据用户ID、流程定义Key和起始时间查询范围内流程汇总信息  */
    List<ProcDefDTO> GetHistorySummary(String userid, String pdkey, Date startdate, Date enddate);

    List<ProcDefDTO> GetHistorySummary(String userid, List<String> pdkeys, Date startdate, Date enddate);

    /** description:根据用户ID、流程定义ID以及查询条件获取已处理任务信息  */
    List<HashMap<String, String>> GetHistoryBizTaskByQuery(String userId, String pdid, Date startdate, Date enddate, HashMap<String, String> bizquery);

    List<HashMap<String, String>> GetHistoryBizTaskByQuery(String userId, String pdid, Date startdate, Date enddate, HashMap<String, String> bizquery, int pageindex, int pagesize);

    /** description:根据mongodb formid 查找form  */
    HashMap<String,Object> GetBizFormById(String formid);

    /** description:获取流程模型集合  */
    List<ProcModelDTO> GetModelList(String modelname);

    /** description:创建一个流程模型  */
    ResultDTO<ProcModelDTO> CreateModel(String modelname, String modelkey, String description, String category);

    /** description:根据模型ID删除一个模型  */
    ResultDTO<String> DeleteModel(String modelid);

    /** description:从模型发布一个流程  */
    ResultDTO<String> DeployFromModel(String modelid);

    /** description:从现有模型拷贝一个新的模型  */
    ResultDTO<ProcModelDTO> CopyModel(String modelid, String modelname, String modelkey, String description, String category);

    /** description:根据单条索引数据刷新该索引涉及历史表单  */
    ResultDTO<String> RefreshHisForm(BizFormIndex formIndex);

    /** description:根据任务ID获取流程定义ID  */
    String GetProcDefIdByTaskId(String taskid);

    /** description:根据流程实例ID获取流程描述 （用于选择人员Bean）  */
    String GetProcDesByPIID(String piid);

    /** description:根据流程定义ID获取流程描述 （用于选择人员Bean）  */
    String GetProcDesByPDID(String pdid);

    /** description:根据流程实例ID获取流程定义ID  */
    String GetProcDefIdByPIID(String piid);

    /** description:根据流程任务ID获取流程实例ID  */
    String GetProcInstanceIdByTid(String tid);


    String GetTaskIdProcInstInfo(String piid, String nodename, String userid);

    /** description:根据流程定义获取最新版本的流程定义实例  */
    ProcDefDTO GetCurrentProcDef(String pdkey);

    /** description:获取所有当前最新版本的流程定义集合  */
    Set<String> GetAllLatestProcDef();

    /** description:根据流程实例id获取流程定义信息  */
    ProcDefDTO GetProcDefInfoByPIID(String piid);

    /** description:获取用户在途涉及的流程  */
    List<ProcDefDTO> GetRunningInvolvedProcess(String userid);

    /** description:获取用户给定流程key的在途涉及的流程  */
    List<ProcDefDTO> GetRunningInvolvedProcess(String userid, String pdkey);

    /** description:获取用户给定流程key的在途涉及的流程  */
    List<ProcDefDTO> GetRunningInvolvedProcess(String userid, List<String> pdkeys);

    /** description:获取当前所有流程的节点定义  */
    List<NodeDefDTO> GetAllProcNodeDef(boolean withServiceNode);

    /** description:获取流程当前的处理人集合  */
    List<String> GetProcessAssignees(String piid);

    /** description:根据流程定义ID获取用户涉及在途流程  */
    List<HashMap<String,Object>> GetRunningInvolvedProcessList(String pdid, String userid);

    /** description:根据流程定义ID获取流程定义信息  */

    /** description:根据任务ID获取业务表单  */
    String GetFormDataByTaskId(String taskid);

    /** description:根据任务ID获取业务表单  */
    ResultDTO<Object> GetBizFormDataByTaskId(String taskid);

    /** description:更新表单数据  */
    ResultDTO<String> UpdateFormData(String taskid, String formdata);

    /** description:根据流程定义ID及节点名称获取任务列表  */
    List<TaskInstDTO> GetTasksByPDKeyAndNodeName(String pdkey, String nodename);

    List<HashMap<String, String>> GetMyProcNodeFormList(String pdkey,String nodename,String userid);

    /** description:根据流程实例ID获取当前待处理节点及候选人Map  */
    Map<String,Set<String>> GetProcInstStatus(String piid);

    /** description:根据流程任务ID以及所需列信息获取任务历史处理信息（从MongoDB获取）  */
    HashMap GetTaskInfoByProps(String taskid, List<String> colums);

    /** description:根据流程定义Key获取完成或未完成任务的统计信息*/
    List<TaskStaticDTO> GetTaskStatic(String pdkey,boolean finished);

    /** description:根据流程实例ID列表 获取以流程实例为Key的任务清单为Value的Map  */
    Map<String, List<TaskInstDTO>> GetMappedTaskHisByPIIDs(List<String> piids);

}
